﻿using NetDh.Lib;
using NetDh.Lib.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http.Filters;

namespace NetDh.Presentation.Common
{
    public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            var exception = actionExecutedContext.Exception;
            StringBuilder sb = new StringBuilder();
            //TestBusinessException 业务自定义异常示例
            if (exception is TestBusinessException)
            {
                sb.AppendLine("【TestBusinessException】");//比如，特殊异常增加特殊标识
                //var ex = (TestBusinessException)exception;//是否需要使用，没使用则注释
            }
            sb.AppendLine(DateTime.Now.ToStringX() + " ---【api】---");
            sb.AppendLine(exception.GetAllErrorMsg());
            //注意：如果有敏感的接口，需要在Action中try..catch返回加工过的异常信息。因为要考虑防止黑客试探异常。
            //而一般接口没什么试探异常的价值(一般是有试探注入的价值)，因此是可以把简单异常信息返回，可以让管理员(包含前端、QA等)快速知道大体的错误原因。
            var oResponse = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, exception.Message);
            //var oResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError) { Content = new StringContent(sb.ToString()) };
            oResponse.Headers.Add("myErrorHeader", "just test");//注意，这边是Response，并不是Request的Header。
            actionExecutedContext.Response = oResponse;
            //记录日志时，详细记录
            //var httpRequest = HttpContext.Current.Request;//api支持异步Action，当是异步Action时HttpContext.Current有可能有问题。网上据说asp.net4.5后是没问题的。
            var httpWrapper = actionExecutedContext.Request.Properties["MS_HttpContext"] as HttpContextWrapper;//用保险方案
            if (httpWrapper != null)
            {
                sb.AppendLine("【IP】:" + httpWrapper.Request.GetClientIp());
            }
            sb.AppendLine("【URL】:" + actionExecutedContext.Request.RequestUri);
            sb.AppendLine("【HEADER】:" + actionExecutedContext.Request.Headers);
            MemoryLog.Add(sb.ToString(), MemoryLogType.error);
            base.OnException(actionExecutedContext);//基类此函数是空函数
        }
    }
}
